package org.erp.spu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.erp.common.page.PageQueryModel;
import org.erp.spu.entity.SpuAttribute;
import org.erp.spu.entity.bo.SpuAttributeBo;
import org.erp.spu.entity.dto.SpuAttributeDto;
import org.erp.spu.entity.vo.SpuAttributeVo;
import org.erp.spu.mapper.SpuAttributeMapper;
import org.erp.spu.service.SpuAttributeService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 属性表(SpuAttribute)表服务实现类
 *
 * @author dingding
 * @since 2025-11-06 09:13:43
 */
@Service("spuAttributeService")
public class SpuAttributeServiceImpl extends ServiceImpl<SpuAttributeMapper, SpuAttribute> implements SpuAttributeService {

    @Resource
    private SpuAttributeMapper spuAttributeMapper;

    @Override
    public List<SpuAttributeVo> getList(SpuAttributeBo spuAttributeBo) {
        LambdaQueryWrapper<SpuAttribute> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.hasText(spuAttributeBo.getAttributeName()), SpuAttribute::getAttributeName, spuAttributeBo.getAttributeName());
        queryWrapper.eq(StringUtils.hasText(spuAttributeBo.getStatus()), SpuAttribute::getStatus, spuAttributeBo.getStatus());
        queryWrapper.eq(spuAttributeBo.getParentId() != null, SpuAttribute::getParentId, spuAttributeBo.getParentId());
        queryWrapper.eq(spuAttributeBo.getType() != null, SpuAttribute::getType, spuAttributeBo.getType());
        queryWrapper.eq(SpuAttribute::getDelFlag, 0);
        List<SpuAttribute> attributeList = spuAttributeMapper.selectList(queryWrapper);
        return attributeList.stream()
                .map(this::convertToVo)
                .collect(Collectors.toList());
    }

    @Override
    public PageQueryModel<SpuAttributeVo> getListByPage(SpuAttributeDto spuAttributeDto) {
        LambdaQueryWrapper<SpuAttribute> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.hasText(spuAttributeDto.getAttributeName()), SpuAttribute::getAttributeName, spuAttributeDto.getAttributeName());
        queryWrapper.eq(StringUtils.hasText(spuAttributeDto.getStatus()), SpuAttribute::getStatus, spuAttributeDto.getStatus());
        queryWrapper.eq(spuAttributeDto.getParentId() != null, SpuAttribute::getParentId, spuAttributeDto.getParentId());
        queryWrapper.eq(spuAttributeDto.getType() != null, SpuAttribute::getType, spuAttributeDto.getType());
        queryWrapper.eq(SpuAttribute::getDelFlag, 0);
        Page<SpuAttribute> page = this.page(spuAttributeDto.buildPage(), queryWrapper);
        List<SpuAttributeVo> voList = page.getRecords().stream()
                .map(this::convertToVo)
                .collect(Collectors.toList());
        return PageQueryModel.of(page.getPages(), voList);
    }

    @Override
    public boolean addSpuAttribute(SpuAttributeDto spuAttributeDto) {
        Assert.isTrue(!checkAttributeName(spuAttributeDto), "属性名称已存在");
        SpuAttribute spuAttribute = new SpuAttribute();
        BeanUtils.copyProperties(spuAttributeDto, spuAttribute);
        return spuAttributeMapper.insert(spuAttribute) > 0;
    }

    @Override
    public boolean updateSpuAttribute(SpuAttributeDto spuAttributeDto) {
        Assert.isTrue(spuAttributeDto.getId() != null, "属性ID不能为空");
        SpuAttribute existingAttribute = spuAttributeMapper.selectById(spuAttributeDto.getId());
        Assert.isTrue(existingAttribute != null, "属性不存在");
        Assert.isTrue(!checkAttributeName(spuAttributeDto), "属性名称已存在");
        
        BeanUtils.copyProperties(spuAttributeDto, existingAttribute);
        return spuAttributeMapper.updateById(existingAttribute) > 0;
    }

    @Override
    public SpuAttributeVo getSpuAttributeVoById(Long id) {
        SpuAttribute spuAttribute = spuAttributeMapper.selectById(id);
        return convertToVo(spuAttribute);
    }

    /**
     * 转换为VO对象
     *
     * @param spuAttribute
     * @return
     */
    private SpuAttributeVo convertToVo(SpuAttribute spuAttribute) {
        if (spuAttribute == null) {
            return null;
        }
        SpuAttributeVo vo = new SpuAttributeVo();
        BeanUtils.copyProperties(spuAttribute, vo);
        return vo;
    }

    /**
     * 检查属性名称是否已存在
     *
     * @param spuAttributeDto
     * @return
     */
    private boolean checkAttributeName(SpuAttributeDto spuAttributeDto) {
        if (!StringUtils.hasText(spuAttributeDto.getAttributeName())) {
            return false;
        }
        LambdaQueryWrapper<SpuAttribute> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SpuAttribute::getAttributeName, spuAttributeDto.getAttributeName());
        queryWrapper.eq(SpuAttribute::getDelFlag, 0);
        if (spuAttributeDto.getId() != null) {
            queryWrapper.ne(SpuAttribute::getId, spuAttributeDto.getId());
        }
        return spuAttributeMapper.selectCount(queryWrapper) > 0;
    }
}
